/**
 * 页面跳转与参数传递
 */
export default {
  /**
   * Hash路由跳转：使用Hash路由时，会自动在实际路径后面加'#/'。
   * 如果url以'/'开头：则相对于'#/'
   * 如果url不以'/'开头：则相对于当前Hash路由
   *
   * @param url 路由地址或全路径地址.
   * @param params 请求参数
   * @param isBlank 是否打开新窗口
   */
  href(url, params, isBlank) {
    if (!url) return;

    url = this.setUrlParams(url, params); //拼接请求参数
    if (!url.startsWith('http')) {
      let {hash, href} = window.location;
      let index = href.indexOf(hash);
      let path = href.substring(0, index + 1); //hash路径之前的地址：包含#
      if (url.startsWith('/')) {
        url = path + url;
      } else {
        let pathRoute = this.getRoutePath(); //Route中配置的路由
        url = path + pathRoute + '/' + url;
      }
    }

    if (isBlank) {
      window.open(url);
    } else {
      window.location.href = url;
    }
  },
  /**
   * 设置请求参数
   *
   * @param url 请求地址
   * @param params 请求参数
   */
  setUrlParams(url, params) {
    if (!url || !params) return url;

    let str = [];
    Object.keys(params).forEach((key) => {
      let item = params[key];
      str.push(`${key}=${JSON.stringify(item)}`);
    });
    str = str.join('&');

    if (url.indexOf('?') < 0) {
      url += '?' + str;
    } else {
      url += '&' + str;
    }
    return url;
  },
  /**
   * 获取请求参数
   */
  getUrlParams() {
    let result = {};
    let {hash} = window.location;
    let index = hash.indexOf('?');
    if (index < 0) return result;

    let paramsArray = hash.substring(index + 1).split('&');
    paramsArray.forEach((key) => {
      let keyArray = key.split('=');
      let k = keyArray[0]; //参数名
      let v = decodeURIComponent(keyArray[1]); //对参数进行URI解码
      result[k] = JSON.parse(v); //将参数值转为对应的类型
    });

    return result;
  },
  /**
   * 获取Route中配置的路由
   */
  getRoutePath() {
    let url = '';
    let {hash} = window.location;
    let index = hash.indexOf('?');
    if (index > 0) {
      url = hash.substring(1, index);
    } else {
      url = hash.substring(1);
    }

    if (url !== '/' && url.endsWith('/')) {
      url = url.substring(0, url.length - 1);
    }
    return url;
  },
  /**
   * 跳转到页面指定位置
   * @param id 元素的ID
   */
  scrollTo(id) {
    let e = document.getElementById(id);
    e && e.scrollIntoView();
  }
};
